#!/user/bin/python
# -*- coding: utf-8 -*-
'''
 @Time    : 2018/5/3 19:58
 @File    : socketio_server_namespace.py
 @desc    :
'''
import threading
import time

from commonSpiders.net.message.socketio_msg import Failure, Success
from commonSpiders.scrapy_clusters_manager.namespace.server_namespace_base import ServerBaseNamespace


class CrawlerProcessNamespace(ServerBaseNamespace):
    '''
    用于与其他服务器上的爬虫管理通信
    '''

    KEY = '/crawler_process'
    context = {}

    def on_connect(self):
        self.emit('logout_success', Success('连接成功'))
        print('服务端连接')

    def on_reconnect(self):
        pass

    def on_disconnect(self):
        self.emit('logout_success', Success('断开成功'))

    def on_register(self, data):
        '''
        注册爬虫管理器
        :param data:
        :return:
        1 获取服务器cpu，内存
        2 获取爬虫管理器状态
        3
        '''
        print('服务端注册')
        msg = self.extend_context.CrawlerManagerService.register_crawler_manager(data, self.socketio)
        self.emit('register_success', msg)

    def on_logout(self, data):
        '''
        注销
        :param data:
        :return:
        1 消除爬虫管理器的信息
        2 消除爬虫管理器下所有工作者信息
        '''
        self.emit('logout_success', Success('注销成功'))


class ClientSystemInfoNamespace(ServerBaseNamespace):

    KEY = '/client_system_info'

    def on_connect(self):
        print('服务端注册时间')
        pass

    def on_update_manager_system_cup(self, data):
        '''
        更新爬虫进程管理器的cpu信息
        :param data:
        :return:
        1 更新爬虫工作者对象状态
        '''
        # self.extend_context.service.update_manager_system_cup(self, data)
        pass

    def on_update_manager_system_meu(self, data):
        '''
        更新爬虫进程管理器的meu信息
        :param data:
        :return:
        1 更新爬虫工作者对象状态
        '''
        # self.extend_context.service.update_manager_system_meu(self, data)
        pass

    def on_update_manager_system_net(self, data):
        '''
        更新爬虫进程管理器的net信息
        :param data:
        :return:
        1 更新爬虫工作者对象状态
        '''
        # self.extend_context.service.update_manager_system_net(self, data)
        pass

    def on_update_manager_system_hd(self, data):
        '''
        更新爬虫进程管理器的hd信息
        :param data:
        :return:
        1 更新爬虫工作者对象状态
        '''
        # self.extend_context.service.update_manager_system_hd(self, data)
        pass

def distribute_task(task_service):

    while True:
        time.sleep(30)
        task_id = 1
        if not task_id:
            msg = Failure('没有任务id， 无法执行任务')
        else:
            msg = task_service.start_task(task_id)
        print(1)


class CrawlerTaskNamespace(ServerBaseNamespace):

    KEY = '/crawler_task'

    '''
    爬虫任务分配器
    '''
    def on_connect(self):

        print('12')
        threading.Thread(target=distribute_task, args=(self.extend_context.CrawlerTaskService,)).start()

    def on_start_task(self, data):
        '''
        开启一个任务
        :param data:
        :return:
        '''
        print('服务端请求分配任务')
        task_id = data['data'].get('task_id', None)
        if not task_id:
            msg = Failure('没有任务id， 无法执行任务')
        else:
            msg = self.extend_context.CrawlerTaskService.start_task(task_id)
        # self.emit('start_task_response', msg)

    def on_stop_task(self, data):
        '''
        停止爬虫任务
        :param data:
        :return:
        '''
        task_id = data.get('task_id', None)
        if not task_id:
            msg = Failure('没有任务id， 无法执行任务')
        else:
            msg = self.extend_context.CrawlerTaskService.stop_task(task_id)
        self.emit('task_stop_info', msg)

    def on_pause_task(self, data):
        '''
        暂停爬虫任务
        :param data:
        :return:
        '''
        task_id = data.get('task_id', None)
        if not task_id:
            msg = Failure('没有任务id， 无法执行任务')
        else:
            msg = self.extend_context.CrawlerTaskService.pause_task(task_id)
        self.emit('task_stop_info', msg)

    def on_resume_task(self, data):
        '''
        恢复爬虫任务
        :param data:
        :return:
        '''
        task_id = data.get('task_id', None)
        if not task_id:
            msg = Failure('没有任务id， 无法执行任务')
        else:
            msg = self.extend_context.CrawlerTaskService.resume_task(task_id)
        self.emit('task_stop_info', msg)